package com.newtouch.xcd.common.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import net.logstash.logback.encoder.org.apache.commons.lang.StringUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 时间工具类
 * 继承了hutools的时间工具类
 * 加入了一些本系统需要的特殊处理
 */
public class DateUtils extends DateUtil {

    /**
     * 通过开始日期和结束日期
     * @param startDate
     * @param endDate
     * @param formatStr
     * @return
     */
    public static List<String> years(String startDate,String endDate,String formatStr){
        Set<String> yearAndQuarter = DateUtils.yearAndQuarter(DateUtils.parse(startDate, formatStr), DateUtils.parse(endDate, formatStr));
        return yearAndQuarter.stream().map(o -> {
            return StrUtils.sub(o, 0, 4);
        }).distinct().collect(Collectors.toList());
    }

    /**
     * 格式化unix时间戳
     * （特别是C传过来的时间戳需要特殊处理）
     *
     * @param unixTimeStr unix形式的时间戳
     * @param formatStr   需要返回的格式
     * @return
     */
    public static String formatUnixTime(String unixTimeStr, String formatStr) {

        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        Long time = new Long(unixTimeStr);
        return format.format(time);
    }


    /**
     * 时间格式转换
     *
     * @param beforeTimeStr   转换前的时间戳
     * @param beforeFormatStr 转换前的时间格式
     * @param afterFormatStr  转换后的时间格式
     * @return
     */
    public static String format(String beforeTimeStr, String beforeFormatStr, String afterFormatStr) {

        DateTime time = DateUtil.parse(beforeTimeStr, beforeFormatStr);
        String result = DateUtil.format(time, afterFormatStr);

        return result;
    }

    /**
     * 计算两个时间相差多少秒
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    public static long betweenSecond(String startTime,String endTime){
       return (DateUtils.parse(endTime).getTime() - DateUtils.parse(startTime).getTime())/1000;
    }

    /**
     * 日期偏移量
     * @param dateStr 日期(只支持yyyy-MM-dd HH:mm:ss)
     * @param x 偏移量
     * @return
     */
    public static String offsetDays(String dateStr,Integer x){
        Date date = DateUtil.parse(dateStr);
        DateTime newDate2 = DateUtil.offsetDay(date, x);
        return DateUtils.format(newDate2,"yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 小时偏移量
     * @param dateStr 日期(只支持yyyy-MM-dd HH:mm:ss)
     * @param x 偏移量
     * @return
     */
    public static String offsetHours(String dateStr,Integer x){
        Date date = DateUtil.parse(dateStr);
        DateTime newDate2 = DateUtil.offsetHour(date, x);
        return DateUtils.format(newDate2,"yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 判断两个时间范围是否有交集
     *
     * @param dynaStartTime  比较时间段开始时间
     * @param dynaEndTime    比较时间段结束时间
     * @param fixedStartTime 参考时间段开始时间
     * @param fixedEndTime   参考时间段结束时间
     * @return
     */
    public static Boolean checkTimesHasOverlap(Date dynaStartTime, Date dynaEndTime, Date fixedStartTime, Date fixedEndTime) {
        return !(dynaEndTime.getTime() < fixedStartTime.getTime() || dynaStartTime.getTime() > fixedEndTime.getTime());
    }

}
